#include<iostream>
#include<algorithm>
using namespace std;
const int N = 1100;
int f[N][N];
int a[N][N];
int s, n,m;//玩家人数，城堡数，拥有士兵数
int main()
{
	cin >> s >> n >> m;
	//我们要让每个城堡横着存，每个人的兵竖着存
	for (int i = 1;i <= s;i++)//列
	{
		for (int j = 1;j <= n;j++)//行
		{
			int x = 0;
			//一共有n行
			cin >> x;
			//贪心，我们直接把刚好能拿下这个城堡的人数存进去
			a[j][i] = x * 2 + 1;//一定要注意是a[j][i]
		}
	}
	//对于每一行排序
	for (int i = 1;i <= n;i++)
	{
		sort(a[i] + 1, a[i] + 1 + s);
	}
	//开始动态规划
	//分组背包
	//一行是一把
	for (int i = 1;i <= n;i++)//从前i组找
	{
		for (int j = m;j >= 0;j--)//兵数量不要超过j
		{
			//不选这一组的
			f[i][j] = f[i - 1][j];
			//选这一组的
			for (int k = 1;k <= s && a[i][k] <= j;k++)
			{
				//我们找的是最大的收益
				f[i][j] = max(f[i][j], f[i - 1][j - a[i][k]] + k * i);//占领这个地方能获得的分数就是k*i
			}
		} 
	}
	cout << f[n][m] << endl;
	return 0;
}